package org.example.demo01.web;

import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.example.demo01.Ingredient;
import org.example.demo01.Taco;
import org.example.demo01.TacoOrder;
import org.example.demo01.data.IngredientRepository;
import org.example.demo01.data.OrderRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
@Slf4j
@Controller
@RequestMapping("/orders")
@SessionAttributes("tacoOrder")
public class OrderController {

    @Autowired//用来代替下面注释的部分
    private OrderRepository orderRepo;
    @Autowired
    private IngredientRepository ingredientRepository;

    @GetMapping("/current")
    public String orderForm(Model model) {
        model.addAttribute("wrap", ingredientRepository.findByType(Ingredient.Type.WRAP));
        model.addAttribute("protein", ingredientRepository.findByType(Ingredient.Type.PROTEIN));
        model.addAttribute("cheese", ingredientRepository.findByType(Ingredient.Type.CHEESE));
        model.addAttribute("veggies", ingredientRepository.findByType(Ingredient.Type.VEGGIES));
        model.addAttribute("sauce", ingredientRepository.findByType(Ingredient.Type.SAUCE));
        return "orderForm";
    }

    //SessionStatus 用于结束会话中由 @SessionAttributes 标记的属性
    //防止数据残留在 Session 中。
    //在 orderRepo.save(order); 之后清除 Session，保持流程干净整洁
    @PostMapping
    public String processOrder(@Valid TacoOrder order, Errors errors, SessionStatus sessionStatus) {
        if (errors.hasErrors()) {
            return "orderForm";
        }

        // 输出调试信息
        System.out.println("Taco 数量：" + order.getTacos().size());
        log.info("当前订单：{}", order); // 打印完整的 tacoOrder 对象信息

        // 为每一个 taco 设置所属的 tacoOrder（如果尚未设置）
        for (Taco taco : order.getTacos()) {
            taco.setOrder(order); // 设置 taco 的 order 字段
        }

        // 保存订单及其包含的 tacos
        orderRepo.save(order);  // 这里会保存 TacoOrder 和相关的 Taco 对象

        sessionStatus.setComplete(); // 清理 session 中的 tacoOrder
        return "redirect:/"; // 重定向到主页或其他页面
    }



}
